package com.cgwx.tmservice.utils;

import com.cgwx.commonutils.DataTypeConvertUtils;
import com.cgwx.tmservice.entity.bean.LatestTmDisplayMatrix;
import com.cgwx.tmservice.entity.bean.TmFrameInfoBean;
import com.cgwx.tmservice.entity.bean.TmHisQueue;
import com.cgwx.tmservice.entity.bean.TmTableStatic;
import com.cgwx.tmservice.entity.tm.TmInfoHisDate;
import com.cgwx.tmservice.entity.tm.TmInfoLogDate;
import com.cgwx.tmservice.entity.tm.TmParametersConfig;
import com.cgwx.tmservice.service.TmInfoHisDateService;
import com.cgwx.tmservice.service.TmInfoLogDateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;

/**
 * @author GaoWei
 * @Date 2023/9/13 - 17:07
 */

@Component
public class ReceiveDataAnalysis {

    @Autowired
    private TmParseAnalysis tmParseAnalysis;
    @Autowired
    private TmInfoLogDate tmInfoLogDate;
    @Autowired
    private TmInfoHisDate tmInfoHisDate;
    @Autowired
    private TmInfoLogDateService tmInfoLogDateService;
    @Autowired
    private TmInfoHisDateService tmInfoHisDateService;

//    接收数据后，进行解析，入库，设置全局变量操作
//    参数1：tmFrame 为224字节遥测原码
//    参数2：channel 为通道
    public void receiveDataOperate(String tmFrame, String channel){
        StringBuffer binTmFrame_temp = new StringBuffer();
        for (int i = 0; i < tmFrame.length();) {
            binTmFrame_temp.append(DataTypeConvertUtils.FullBinary(DataTypeConvertUtils.Hex_to_Binary(tmFrame.substring(i, i+2)),8));
            i += 2;
        }
        StringBuffer binTmFrame = new StringBuffer(binTmFrame_temp);
//        得到此帧的遥测帧识别码
        String tmIdentifyInfo = tmParseAnalysis.getTmIdentifyInfo(binTmFrame.toString());
//        将遥测原码插入到数据库中
        tmInfoLogDate = new TmInfoLogDate();
        tmInfoLogDate.setDataChannel(channel);
        tmInfoLogDate.setTmframeIdentifiers(tmIdentifyInfo);
        tmInfoLogDate.setValue(tmFrame);
//        插入遥测原码数据，同时得到遥测原码的遥测帧id值，以备插入解析记录时使用
        TmInfoLogDate insertTmInfoLogDate = tmInfoLogDateService.saveTmInfoLogDate(TmTableStatic.TM_LOG_TABLE_NAME, tmInfoLogDate);
//        根据遥测帧识别码，得到此帧遥测参数解析配置的ArrayList
        ArrayList<TmParametersConfig> tmParametersConfigArrayList = TmFrameInfoBean.TM_PARAMETER_INFO_MAP.get(tmIdentifyInfo);
        if (tmParametersConfigArrayList != null) {
            String utc_time_now = tmParseAnalysis.getTmUtcTimeInfo(binTmFrame.toString());
//             有此帧的配置，遍历此帧下的所有遥测参数配置信息
            TmHisQueue tmHisQueue = new TmHisQueue();
            for (TmParametersConfig tmParametersConfig : tmParametersConfigArrayList) {
//                即从头到尾，一个参数一个参数的去解析
                tmInfoHisDate = new TmInfoHisDate();
//                此遥测参数对应遥测帧id、识别码
//                此遥测参数配置，整帧的原码值，UTC时间，通道号
                tmInfoHisDate = tmParseAnalysis.parseTmParameter(insertTmInfoLogDate.getId(), tmIdentifyInfo, tmParametersConfig, binTmFrame.toString(), utc_time_now, channel);
//                将此参数的解析记录存到ArrayList中
                tmHisQueue.tmInfoHisDateBeanList.add(tmInfoHisDate);
            }
//            将当前帧最新的遥测矩阵存储在全局静态变量中
//            key不重复，如果一致则覆盖
//            value为tmframe_id一致的一组遥测解析数据
            LatestTmDisplayMatrix.LATEST_TM_DISPLAY_MATRIX.put(tmIdentifyInfo, tmHisQueue.tmInfoHisDateBeanList);
//            将tmHisQueue插入解析记录的数据库中（批量插入）
            tmInfoHisDateService.saveTmInfoHisDateBatch(TmTableStatic.TM_HIS_TABLE_NAME, tmHisQueue.tmInfoHisDateBeanList);
        }
    }
}
